/*
 * my_printf.h
 *
 *  Created on: Sep 13, 2025
 *      Author: ADMIN
 */

#ifndef DOMAIN_INC_MY_PRINTF_H_
#define DOMAIN_INC_MY_PRINTF_H_

#include "stm32f4xx_hal.h"
#include <stdarg.h>
#include <stdint.h>
#include <string.h>

// 字符输出函数指针类型
typedef void (*putchar_func_t)(char);
// 定点数类型定义（Q16.16格式）
typedef int32_t fixed_t;

// 函数声明

/**
 * @brief 设置字符输出函数
 * @param func 指向输出字符函数的指针
 */
void set_putchar_function(putchar_func_t func);

/**
 * @brief 输出单个字符
 * @param c 要输出的字符
 */
void _putchar(char c);

/**
 * @brief 输出字符串
 * @param str 要输出的字符串
 */
void _puts(const char *str);

/**
 * @brief 浮点数转定点数
 * @param f 浮点数
 * @return 对应的定点数
 */
fixed_t float_to_fixed(float f);

/**
 * @brief 定点数转浮点数
 * @param f 定点数
 * @return 对应的浮点数
 */
float fixed_to_float(fixed_t f);

/**
 * @brief 简化版 printf 实现
 * @param format 格式字符串
 * @param ... 可变参数
 *
 * 支持格式：
 * %d, %i - 有符号十进制整数
 * %u - 无符号十进制整数
 * %x, %X - 十六进制整数
 * %c - 单个字符
 * %s - 字符串
 * %f - 浮点数（支持精度控制：%.2f, %.6f等）
 * %% - 百分号字符
 */
void my_printf(const char *format, ...);

/**
 * @brief 带可变参数的 printf 函数
 * @param format 格式字符串
 * @param args 可变参数列表
 */
void my_vprintf(const char *format, va_list args);

// 宏定义
#define FIXED_SHIFT 14
#define FIXED_ONE (1 << FIXED_SHIFT)
#define FLOAT_TO_FIXED(f) ((fixed_t)((f) * FIXED_ONE + ((f) >= 0 ? 0.5 : -0.5)))
#define FIXED_TO_INT(f) ((f) >> FIXED_SHIFT)
#define FIXED_FRAC_PART(f) ((f) & ((1 << FIXED_SHIFT) - 1))



#endif /* DOMAIN_INC_MY_PRINTF_H_ */
